Bluetoothシリアル接続でスマホからRaspberry Pi操作
iOSのことは判らない(あとandroidで他にもつとよいアプリがあるのかも知らん)ので、そこはよしなに。
環境
DietPi側ではBluetooth(Bluez)とhciconfig、sdptool、rfcommが使へること、あとttyでのシリアル接続ができるやうになつてればたぶんいいのでは。
Bluez以外は特にインストールも無く、それもdietpi-configでBluetoothを有効にすれば勝手にインストールしてくれるのでそこでこけなければいけるはず。
詳細は主にこちらのページに書かれてゐる通り。各コマンドについては正直あまりよく理解してゐない。 手順
Piとスマホのペアリング
sudo bluetoothctl(root権限必須。ここで最初こけた)でpower on、scan onでスマホのMACアドレスを引いて、pair xx:xx:xx:xx:xx trust xx:xx:xx:xx:xxまでできた前提で。
connectは失敗しても大丈夫なので気にしない。なんか「connect失敗したらpulseaudio-module-bluetoothを入れろ」とか云はれるけれど、入れてもconnectできないしここでconnectできなくてもポート開けば繋がるので(この辺りはよく解らない)。
bluetoothdを "-C" オプション付きで再起動
sudo systemctl stop bluetoothで一旦bluetoothを止める。
sudo bluetoothd -C &、sudo hciconfig hci0 upでbluetoothを手動で起動し直してhci0ポートをup
sudo sdptool add SPでシリアルポート追加。
sudo sdptool browse local | grep -i serialで"Serial Port" (0x1101)とか、とにかくSerial Portが出来てゐることを確認。
rfcommコマンドを使ふ。rfcomm0ポートを開いて待機状態にする、といふ認識でいいのか。
sudo rfcomm watch 0 1 agetty rfcomm0 115200が基本の形つぽい。
sudo rfcomm watch 0 1 agetty rfcomm0 115200 -a xxxで「xxx」ユーザでの接続。
sudo rfcomm watch 0 1 agetty -n -l /bin/bash rfcomm0 115200で認証無しのrootログイン。
個人的にserviceやdaemon周りを弄るのでrootログインにする
一般ユーザでsudoは効かない様子なのでsudoする用事があるならrootログインでいいのかな、と(認証は利便性を優先。どうせDAPとして使ふだけなので)。
Raspberry Pi Zeroよりスマホ取られた方がダメージがでかいといふのもある。
もちろん用途によつてはきちんとセキュリティ固めといた方がいいかと。
スマホからSerial Bluetooth Terminalを起動してデバイスの欄にRasPiがあることを確認し(ペアリングができてゐれば出る)、タップすれば接続されるはず。
繋がればあとは普通にコマンド入力とかできるはず。
その間、SSHの方は待機状態で止まつてゐる。ctrl+Cで接続解除して抜ける。
サービスとしてsystemdに登録、常駐させる
/usr/lib/systemd/system/bluetooth.service(DietPiの場合)を編集して常にbluetoothdが-Cオプションで起動して、シリアルポートを開くやうにしておく。
ExecStart=/usr/lib/bluetooth/bluetoothd -CとExecStartPost=/usr/bin/sdptool add SPを追加。元のExecStart=/usr/lib/bluetooth/bluetoothdはコメントアウト。
sudo systemctl restart bluetoothで再起動。
DietPi自体を再起動しないとコケるかも(既にhci0ポートが出来てゐるので)。
.serviceの書き替へではなく、/etc/system/systemd辺りに(適当でいいのか?)bluetooth.service.dディレクトリを作つてそこにbluetooth.confファイルを作るのがお作法としてはよろしいらしい。
上書きする部分(上記のExecStartとExecStartPost)を書き込む
.serviceのファイルは自動で更新され得る(らしい)ので。
実際、OS更新で上書きされた。
現状、この方法でなぜか上手くいかないのでbluetooth.serviceに直接書き込んでゐる。
/etc/systemd/system/rfcomm.serviceを以下の通り作成。
etc/rc.localにコマンドを書き込む方がシンプルでいいかも知れない。
code:rfcomm.service
Description=RFCOMM service
After=bluetooth.service
Requires=bluetooth.service
ExecStart=/usr/bin/rfcomm watch 0 1 /sbin/agetty -n -l /bin/bash rfcomm0 115200
WantedBy=multi-user.target
rfcommのオプションはログインしたい状態に合はせて。ここでは認証無しrootログイン。
DAPとしてしか使はないのでこんなにガバガバにポート開けてる訳で、そこはご留意のほど。
rfcomm.serviceを有効化。
code:shell
sudo systemctl daemon-reload
sudo systemctl start rfcomm
sudo systemctl enable rfcomm
この状態で、バックグラウンドで常に待機してゐる形になる。